/**
 @file ctc_tdx.h

 @author  Copyright (C) 2011 Centec Networks Inc.  All rights reserved.

 @date 2020-12-30

 @version v1.0

   This file contains all TDX related data structure, enum, macro and proto.

Telemetry Data eXport("TDX") defined a variety of telemetry data formats. These data can be divided into
the fllowing three categories:
   1. Telemetry Statistics eXport("TSX")
   2. Telemetry Events eXport("TEX")
   3. Telemetry Informations eXport("TIX")
*/
#ifndef _CTC_TDX_H
#define _CTC_TDX_H
#ifdef __cplusplus
extern "C" {
#endif
#include "ctc_const.h"

#define CTC_TDX_VER 1  /*TDX Version*/

/*

Telemetry Header & Tlv Header Format:

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-----------
|ver 4b |  type 8b      |    flags 8b   |      reserved1 12b    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                         reserved2 32b                         |   Header
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+   (16 B)
|                         switch id 32b                         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      sequence id 32b                          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-----------
|           type 16b            |          length 16b           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+   TLV Hdr
|                                                               |   (12 B)
+                         timestamp 64b                         +
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-----------
|                                                               |
~                   data  (length - 12) bytes                   ~
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
*/
typedef struct ctc_tdx_hdr_s
{
    uint32 rsv1  : 12;
    uint32 flags : 8;   /**< [TMM.AT] bit 0: 0 means from DMA encap, 1 means from ECPU; bit1-7 reserved*/
    uint32 type  : 8;   /**< [TMM.AT] data type, ctc_tdx_type_t*/
    uint32 ver   : 4;   /**< [TMM.AT] verion, CTC_TDX_VER*/
    uint32 rsv2;
    uint32 switch_id;   /**< [TMM.AT] switch id*/
    uint32 seq_id;      /**< [TMM.AT] sequence id*/
}ctc_tdx_hdr_t;

typedef enum ctc_tdx_type_e
{
    CTC_TDX_TYPE_IPFIX             = 0, /**< [TMM.AT] ipfix export */
    CTC_TDX_TYPE_MAC_STATS         = 1, /**< [TMM.AT] mac stats export */
    CTC_TDX_TYPE_DROP_STATS        = 2, /**< [TMM.AT] droped packet statistics */
    CTC_TDX_TYPE_BUFFER_STATS      = 3, /**< [TMM.AT] buffer statistics */
    CTC_TDX_TYPE_LATENCY_STATS     = 4, /**< [TMM.AT] latency statistics */
    CTC_TDX_TYPE_BUFFER_WATERMARK  = 5, /**< [TMM.AT] buffer watermark */
    CTC_TDX_TYPE_LATENCY_WATERMARK = 6, /**< [TMM.AT] latency watermark */
    CTC_TDX_TYPE_DROP_EVENT        = 7, /**< [TMM.AT] packet drop event */
    CTC_TDX_TYPE_BUFFER_EVENT      = 8, /**< [TMM.AT] buffer congestion event */
    CTC_TDX_TYPE_LATENCY_EVENT     = 9, /**< [TMM.AT] latency congestion event */

    CTC_TDX_TYPE_MAX = 256
}ctc_tdx_type_t;



typedef struct ctc_tdx_tlv_hdr_s
{
    uint32 len  : 16;       /**< [TMM.AT] tlv total length, contains tlv header */
    uint32 type : 16;       /**< [TMM.AT] tlv value type */
    uint32 timestamp[2];    /**< [TMM.AT] tlv timestamp */
    char   val[0];          /**< [TMM.AT] tlv value pointer */
}ctc_tdx_tlv_hdr_t;


/*
1. MAC-Stats Format:
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-----------
|ver 4b |  type 8b      |    flags 8b   |      reserved1 12b    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                         reserved2 32b                         |   Header
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+   (16 B)
|                         switch id 32b                         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      sequence id 32b                          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-----------
|           type 16b            |          length 16b           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+    TLV Hdr
|                                                               |   (12 B)
+                         timestamp 64b                         +
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-----------
|                        Mac ID (32b)                           | mac id
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-----------
|                     byteCntDataLo(32b)                        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|              reserved 24 b                    | byteCntDataHi |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+mac-stats[0]
|                    frameCntDataLo 32 b                        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                     reserved 30 b                         | Hi|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-----------
|                                                               |    .
~                              ~                                ~    ~
|                                                               |    .
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-----------
|                     byteCntDataLo(32b)                        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|              reserved 24 b                    | byteCntDataHi |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+mac-stats[39]
|                    frameCntDataLo 32 b                        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                     reserved 30 b                         | Hi|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-----------


2. Drop-Stats Format:
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-----------
|ver 4b |  type 8b      |    flags 8b   |      reserved1 12b    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                         reserved2 32b                         |   Header
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+   (16 B)
|                         switch id 32b                         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      sequence id 32b                          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-----------
|           type 16b            |          length 16b           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+    TLV Hdr
|                                                               |   (12 B)
+                         timestamp 64b                         |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-----------
|                elements num of drop-stats array(32 b)         |    cnt
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-----------
|                          gport (32 b)                         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|          reserved(16 b)       |       reason (16 b)           |   arr[0]
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                          count (32 b)                         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-----------
|                                                               |    .
~                              ~                                ~	 ~
|                                                               |	 .
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-----------
|                          gport (32 b)                         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|          reserved(16 b)       |       reason (16 b)           | arr[cnt-1]
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                          count (32 b)                         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-----------


3. Buffer-Watermark Format:
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-----------
|ver 4b |  type 8b      |    flags 8b   |      reserved1 12b    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                         reserved2 32b                         |   Header
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+   (16 B)
|                         switch id 32b                         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      sequence id 32b                          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-----------
|           type 16b            |          length 16b           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+    TLV Hdr
|                                                               |   (12 B)
+                         timestamp 64b                         +
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-----------
|                   ingress_total_thrd (32 b)                   |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                     ingress_sc_thrd[0]                        |ingress thrd
~                            ...                                ~
|                     ingress_sc_thrd[3]                        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-----------
|                    egress_total_thrd(32 b)                    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      egress_sc_thrd[0]                        | egress cnt
~                            ...                                ~
|                      egress_sc_thrd[3]                        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-----------
|        elements num of buffer-watermark array(32 b)           |     cnt
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-----------
|                          gport(32 b)                          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                         ingress thrd                          |    arr[0]
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                          egres thrd                           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-----------
|                                                               |    .
~                              ~                                ~    ~
|                                                               |    .
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-----------
|                          gport(32 b)                          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                         ingress thrd                          | arr[cnt-1]
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                          egres thrd                           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-----------

4. Latency-Watermark Format:
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-----------
|ver 4b |  type 8b      |    flags 8b   |      reserved1 12b    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                         reserved2 32b                         |   Header
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+   (16 B)
|                         switch id 32b                         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      sequence id 32b                          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-----------
|           type 16b            |          length 16b           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+    TLV Hdr
|                                                               |   (12 B)
+                         timestamp 64b                         +
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-----------
|         elements num of latency-watermark array(32 b)         |      cnt
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -----------
|                          gport(32 b)                          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                        min latency 32b                        |     arr[0]
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                        max latency 32b                        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-----------
|                                                               |    .
~                              ~                                ~    ~
|                                                               |    .
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-----------
|                          gport(32 b)                          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                        min latency 32b                        |  arr[cnt-1]
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                        max latency 32b                        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -----------


*/

/*
explain mac stats array:
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*    dir    *arr idx*  stats type                               *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*           *  0    * rxGoodUcast                               *
*           * * * * * * * * * * * * * * * * * * * * * * * * * * *
*           *  1    * rxGoodMcast                               *
*           * * * * * * * * * * * * * * * * * * * * * * * * * * *
*           *  2    * rxGoodBcast                               *
*           * * * * * * * * * * * * * * * * * * * * * * * * * * *
*           *  3    * rxGoodPauseFrameNor                       *
*           * * * * * * * * * * * * * * * * * * * * * * * * * * *
*           *  4    * rxGoodPauseFramePfc                       *
*           * * * * * * * * * * * * * * * * * * * * * * * * * * *
*           *  5    * rxGoodCtlFrame                            *
*           * * * * * * * * * * * * * * * * * * * * * * * * * * *
*           *  6    * rxFcsError                                *
*           * * * * * * * * * * * * * * * * * * * * * * * * * * *
*           *  7    * rxMacOverrun                              *
*           * * * * * * * * * * * * * * * * * * * * * * * * * * *
*           *  8    * rxGoodPktLen<64B                          *
*           * * * * * * * * * * * * * * * * * * * * * * * * * * *
*           *  9    * rxBadPktLen                               *
*           * * * * * * * * * * * * * * * * * * * * * * * * * * *
*  rx stats *  10   * MTU1 < rxGoodPktLen <= MTU2               *
*           * * * * * * * * * * * * * * * * * * * * * * * * * * *
*           *  11   * MTU1 < rxBadPktLen <= MTU2                *
*           * * * * * * * * * * * * * * * * * * * * * * * * * * *
*           *  12   * rxGoodPktLen > MTU2                       *
*           * * * * * * * * * * * * * * * * * * * * * * * * * * *
*           *  13   * rxBadPktLen >MUT2                         *
*           * * * * * * * * * * * * * * * * * * * * * * * * * * *
*           *  14   * rxPktLen == 64B                           *
*           * * * * * * * * * * * * * * * * * * * * * * * * * * *
*           *  15   * 64B < rxPktLen <= 127B                    *
*           * * * * * * * * * * * * * * * * * * * * * * * * * * *
*           *  16   * 127B < rxPktLen <= 255B                   *
*           * * * * * * * * * * * * * * * * * * * * * * * * * * *
*           *  17   * 255B < rxPktLen <= 511B                   *
*           * * * * * * * * * * * * * * * * * * * * * * * * * * *
*           *  18   * 511B < rxPktLen <= 1023B                  *
*           * * * * * * * * * * * * * * * * * * * * * * * * * * *
*           *  19   * 1023B < rxPktLen <= 1518B                 *
*           * * * * * * * * * * * * * * * * * * * * * * * * * * *
*           *  20   * 1518B < rxPktLen <= 2047B                 *
*           * * * * * * * * * * * * * * * * * * * * * * * * * * *
*           *  21   * 2047B < rxPktLen <= MTU1                  *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*           *  22   * txGoodUcast                               *
*           * * * * * * * * * * * * * * * * * * * * * * * * * * *
*           *  23   * txGoodMcast                               *
*           * * * * * * * * * * * * * * * * * * * * * * * * * * *
*           *  24   * txGoodBcast                               *
*           * * * * * * * * * * * * * * * * * * * * * * * * * * *
*           *  25   * txGoodPauseFrame                          *
*           * * * * * * * * * * * * * * * * * * * * * * * * * * *
*           *  26   * txGoodCtlFrame                            *
*           * * * * * * * * * * * * * * * * * * * * * * * * * * *
*           *  27   * txFcsError                                *
*           * * * * * * * * * * * * * * * * * * * * * * * * * * *
*           *  28   * txMacUnderrun                             *
*           * * * * * * * * * * * * * * * * * * * * * * * * * * *
*           *  29   * txPktLen < 64B                            *
*           * * * * * * * * * * * * * * * * * * * * * * * * * * *
*           *  30   * txPktLen == 64B                           *
*           * * * * * * * * * * * * * * * * * * * * * * * * * * *
*           *  31   * 64B < txPktLen <= 127B                    *
*           * * * * * * * * * * * * * * * * * * * * * * * * * * *
*           *  32   * 127B < txPktLen <= 255B                   *
*           * * * * * * * * * * * * * * * * * * * * * * * * * * *
* tx  stats *  33   * 255B < txPktLen <= 511B                   *
*           * * * * * * * * * * * * * * * * * * * * * * * * * * *
*           *  34   * 511B < txPktLen <= 1023B                  *
*           * * * * * * * * * * * * * * * * * * * * * * * * * * *
*           *  35   * 1023B < txPktLen <= 1518B                 *
*           * * * * * * * * * * * * * * * * * * * * * * * * * * *
*           *  36   * 1518B < txPktLen <= 2047B                 *
*           * * * * * * * * * * * * * * * * * * * * * * * * * * *
*           *  37   * 2047B < txPktLen <= MTU1                  *
*           * * * * * * * * * * * * * * * * * * * * * * * * * * *
*           *  38   * MUT1 < txPktLen <= MTU2                   *
*           * * * * * * * * * * * * * * * * * * * * * * * * * * *
*           *  39   * txPktLen > MTU2                           *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*/

#define CTC_TSX_MAC_STATS_NUM 40  /* defined mac stats table num */

typedef struct  ctc_tsx_mac_stats_array_s
{
    uint32 byteCntDataLo;           /**< [TMM.AT] byte count low 32bit */
    uint32 byteCntDataHi : 8;       /**< [TMM.AT] byte count high 8bit */
    uint32 rsv1 : 24;
    uint32 frameCntDataLo;          /**< [TMM.AT] frame count low 32bit */
    uint32 frameCntDataHi : 2;      /**< [TMM.AT] frame count high 2bit */
    uint32 rsv2 : 30;
}ctc_tsx_mac_stats_array_t;

typedef struct  ctc_tsx_mac_stats_s
{
    ctc_tdx_tlv_hdr_t tlv_hdr;      /**< [TMM.AT] mac stats struct tlv header */
    uint32 gport;                   /**< [TMM.AT] gport */
    ctc_tsx_mac_stats_array_t arr[CTC_TSX_MAC_STATS_NUM]; /**< [TMM.AT] mac stats table array */
}ctc_tsx_mac_stats_t;


typedef struct ctc_tsx_buffer_watermark_array_s
{
    uint32 gport;               /**< [TMM.AT] gport */
    uint32 ingress_thrd;        /**< [TMM.AT] ingress watermark */
    uint32 egress_thrd;         /**< [TMM.AT] egress watermark */
}ctc_tsx_buffer_watermark_array_t;

typedef struct ctc_tsx_buffer_watermark_s
{
    ctc_tdx_tlv_hdr_t tlv_hdr;        /**< [TMM.AT] buffer watermark struct tlv header */
    uint32 ingress_total_thrd;        /**< [TMM.AT] chip ingress total buffer watermark */
    uint32 ingress_sc_thrd[4];        /**< [TMM.AT] chip ingress sc buffer watermark */
    uint32 egress_total_thrd;         /**< [TMM.AT] chip egress total buffer watermark */
    uint32 egress_sc_thrd[4];         /**< [TMM.AT] chip egress sc buffer watermark */
    uint32 arr_cnt;                   /**< [TMM.AT] elements number of array */
    ctc_tsx_buffer_watermark_array_t arr[0];    /**< [TMM.AT] buffer watermark array pointer*/
}ctc_tsx_buffer_watermark_t;


typedef struct ctc_tsx_latency_watermark_array_s
{
    uint32 gport;               /**< [TMM.AT] gport */
    uint32 min_latency;         /**< [TMM.AT] minimal latency */
    uint32 max_latency;         /**< [TMM.AT] maximal latency */
}ctc_tsx_latency_watermark_array_t;

typedef struct ctc_tsx_latency_watermark_s
{
    ctc_tdx_tlv_hdr_t tlv_hdr;          /**< [TMM.AT] latency watermark struct tlv header */
    uint32 arr_cnt;                     /**< [TMM.AT] elements number of array */
    ctc_tsx_latency_watermark_array_t arr[0]; /**< [TMM.AT] latency watermark array pointer*/
}ctc_tsx_latency_watermark_t;


#define CTC_TSX_DROP_REASON_CNT 128/*ingress 64 + egress 64*/
typedef struct ctc_tsx_drop_stats_array_s
{
    uint32 gport;           /**< [TMM.AT] gport */
    uint32 reason : 16;     /**< [TMM.AT] reason id */
    uint32 rsv    : 16;
    uint32 count;           /**< [TMM.AT] droped packet count */
}ctc_tsx_drop_stats_array_t;

struct ctc_tsx_drop_stats_s
{
    ctc_tdx_tlv_hdr_t tlv_hdr;      /**< [TMM.AT] drop stats struct tlv header */
    uint32 arr_cnt;                 /**< [TMM.AT] elements number of array */
    ctc_tsx_drop_stats_array_t arr[0];  /**< [TMM.AT] drop stats array pointer*/
};
typedef struct ctc_tsx_drop_stats_s ctc_tsx_drop_stats_t;


/*

1. Drop-Event Format:

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-----------
|ver 4b |  type 8b      |    flags 8b   |      reserved1 12b    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                         reserved2 32b                         |   Header
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+   (16 B)
|                         switch id 32b                         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      sequence id 32b                          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-----------
|           type 16b            |          length 16b           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+    TLV Hdr
|                                                               |   (12 B)
+                         timestamp 64b                         +
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-----------
|                          src_gport                            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|  drop reason  |   position    |       reserved                |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                          mac_da[31-0]                         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|        mac_sa[15-0]           |           mac_da[47-32]       |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                          mac_sa[47-32]                        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
~                          ipda 128bits                         ~
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
~                          ipsa 128bits                         ~
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|        l4 src port            |          l4 dst port          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|    protocol   |    ip_ver     |     masks     |      rsv      |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

*/
typedef enum ctc_tex_drop_pkt_info_mask_e
{
    CTC_DROP_PKT_INFO_MASK_MACDA = 0x1,
    CTC_DROP_PKT_INFO_MASK_MACSA = 0x2,
    CTC_DROP_PKT_INFO_MASK_IPDA = 0x4,
    CTC_DROP_PKT_INFO_MASK_IPSA = 0x8,
    CTC_DROP_PKT_INFO_MASK_SRCPORT = 0x10,
    CTC_DROP_PKT_INFO_MASK_DSTPORT = 0x20,
    CTC_DROP_PKT_INFO_MASK_PROTOCOL = 0x40,
    CTC_DROP_PKT_INFO_MASK_IP_VERSION = 0x80
}ctc_tex_drop_pkt_info_mask_t;


typedef struct ctc_tex_drop_pkt_info_s
{
    mac_addr_t  mac_da;       /**< [TMM.AT] mac da address */
    mac_addr_t  mac_sa;       /**< [TMM.AT] mac sa address */
    union {
        ip_addr_t v4;                     /**< [TMM.AT] ipv4 da address*/
        ipv6_addr_t v6;                   /**< [TMM.AT] ipv6 da address*/
    }ip_da;
    union {
        ip_addr_t v4;                     /**< [TMM.AT] ipv4 sa address*/
        ipv6_addr_t v6;                   /**< [TMM.AT] ipv6 sa address*/
    }ip_sa;
    uint32 dst_port : 16; /**< [TMM.AT] L4 destination port */
    uint32 src_port : 16; /**< [TMM.AT] L4 source port */

    uint32 rsv    : 8;
    uint32 masks  : 8;  /**< [TMM.AT] fields valid flag, refer to ctc_tex_drop_pkt_info_mask_t*/
    uint32 ip_ver : 8;  /**< [TMM.AT] 4:ipv4; 6:ipv6 */
    uint32 protocol : 8; /**< [TMM.AT] ip protocol */
}ctc_tex_drop_pkt_info_t;

typedef struct ctc_tex_drop_event_s
{
    ctc_tdx_tlv_hdr_t tlv_hdr;              /**< [TMM.AT] drop event struct tlv header */
    uint32 src_gport;                       /**< [TMM.AT] source gport */
    uint32 rsv : 16;
    uint32 drop_reason : 8;                 /**< [TMM.AT] drop reason */
    uint32 position : 8;                    /**< [TMM.AT] drop position, 0 : ipe, 2: epe */
    ctc_tex_drop_pkt_info_t pkt_info;
}ctc_tex_drop_event_t;

#ifdef __cplusplus
}
#endif

#endif  /*_CTC_TDX_H*/

